"""
初始化监控功能权限
"""
from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group
from cmdb.models import MenuItem, Role, RoleMenuPermission, GroupRole


class Command(BaseCommand):
    help = '初始化监控功能的菜单项和权限'

    def handle(self, *args, **options):
        self.stdout.write('开始初始化监控功能权限...')
        
        # 创建监控菜单项
        self.create_monitoring_menus()
        
        # 为管理员角色添加监控权限
        self.assign_admin_permissions()
        
        self.stdout.write(self.style.SUCCESS('监控功能权限初始化完成'))

    def create_monitoring_menus(self):
        """创建监控相关菜单项"""
        self.stdout.write('创建监控菜单项...')
        
        # 检查是否已存在zabbix管理菜单
        zabbix_menu, created = MenuItem.objects.get_or_create(
            path='/zabbix',
            defaults={
                'name': 'Zabbix管理',
                'icon': 'fa-chart-line',
                'order': 5,
                'sort_weight': 5.0,
                'is_enabled': True,
                'description': 'Zabbix监控系统管理',
                'permission_code': 'monitoring.view'
            }
        )
        
        if created:
            self.stdout.write(f'  ✓ 创建主菜单: {zabbix_menu.name}')
        else:
            self.stdout.write(f'  - 主菜单已存在: {zabbix_menu.name}')
        
        # 创建子菜单项
        submenus = [
            {
                'path': '/zabbix/servers',
                'name': '服务器配置',
                'icon': 'fa-server',
                'order': 1,
                'description': 'Zabbix和Grafana服务器配置管理',
                'permission_code': 'monitoring.server.manage'
            },
            {
                'path': '/zabbix/dashboard',
                'name': '监控仪表板',
                'icon': 'fa-dashboard',
                'order': 2,
                'description': '监控数据仪表板和图表展示',
                'permission_code': 'monitoring.dashboard.view'
            },
            {
                'path': '/zabbix/hosts',
                'name': '主机监控',
                'icon': 'fa-desktop',
                'order': 3,
                'description': '主机监控状态和性能数据',
                'permission_code': 'monitoring.host.view'
            },
            {
                'path': '/zabbix/alerts',
                'name': '告警管理',
                'icon': 'fa-bell',
                'order': 4,
                'description': '监控告警管理和通知配置',
                'permission_code': 'monitoring.alert.manage'
            }
        ]
        
        for submenu_data in submenus:
            submenu, created = MenuItem.objects.get_or_create(
                path=submenu_data['path'],
                defaults={
                    'name': submenu_data['name'],
                    'icon': submenu_data['icon'],
                    'parent': zabbix_menu,
                    'order': submenu_data['order'],
                    'sort_weight': float(submenu_data['order']),
                    'is_enabled': True,
                    'description': submenu_data['description'],
                    'permission_code': submenu_data['permission_code']
                }
            )
            
            if created:
                self.stdout.write(f'  ✓ 创建子菜单: {submenu.name}')
            else:
                self.stdout.write(f'  - 子菜单已存在: {submenu.name}')

    def assign_admin_permissions(self):
        """为管理员角色分配监控权限"""
        self.stdout.write('分配管理员权限...')
        
        # 获取或创建管理员角色
        admin_role, created = Role.objects.get_or_create(
            name='系统管理员',
            defaults={
                'description': '系统管理员角色，拥有所有权限',
                'is_system': True
            }
        )
        
        if created:
            self.stdout.write(f'  ✓ 创建管理员角色: {admin_role.name}')
        else:
            self.stdout.write(f'  - 管理员角色已存在: {admin_role.name}')
        
        # 获取所有监控相关菜单项
        monitoring_menus = MenuItem.objects.filter(
            path__startswith='/zabbix'
        )
        
        # 为管理员角色分配所有监控菜单的读写权限
        for menu in monitoring_menus:
            permission, created = RoleMenuPermission.objects.get_or_create(
                role=admin_role,
                menu_item=menu,
                defaults={
                    'can_read': True,
                    'can_write': True
                }
            )
            
            if created:
                self.stdout.write(f'  ✓ 分配权限: {admin_role.name} -> {menu.name}')
            else:
                # 更新现有权限确保有读写权限
                if not permission.can_read or not permission.can_write:
                    permission.can_read = True
                    permission.can_write = True
                    permission.save()
                    self.stdout.write(f'  ✓ 更新权限: {admin_role.name} -> {menu.name}')
                else:
                    self.stdout.write(f'  - 权限已存在: {admin_role.name} -> {menu.name}')
        
        # 确保管理员组与管理员角色关联
        try:
            admin_group = Group.objects.get(name='管理员')
            group_role, created = GroupRole.objects.get_or_create(
                group=admin_group,
                role=admin_role
            )
            
            if created:
                self.stdout.write(f'  ✓ 关联组角色: {admin_group.name} -> {admin_role.name}')
            else:
                self.stdout.write(f'  - 组角色已关联: {admin_group.name} -> {admin_role.name}')
                
        except Group.DoesNotExist:
            self.stdout.write(self.style.WARNING('  ! 管理员组不存在，请手动创建并关联角色'))

    def create_monitoring_roles(self):
        """创建监控相关的专用角色"""
        self.stdout.write('创建监控专用角色...')
        
        # 监控查看者角色
        viewer_role, created = Role.objects.get_or_create(
            name='监控查看者',
            defaults={
                'description': '只能查看监控数据，无法修改配置',
                'is_system': False
            }
        )
        
        if created:
            self.stdout.write(f'  ✓ 创建角色: {viewer_role.name}')
        
        # 监控管理员角色
        manager_role, created = Role.objects.get_or_create(
            name='监控管理员',
            defaults={
                'description': '可以管理监控配置和告警规则',
                'is_system': False
            }
        )
        
        if created:
            self.stdout.write(f'  ✓ 创建角色: {manager_role.name}')
        
        # 分配权限
        monitoring_menus = MenuItem.objects.filter(path__startswith='/zabbix')
        
        for menu in monitoring_menus:
            # 查看者只有读权限
            RoleMenuPermission.objects.get_or_create(
                role=viewer_role,
                menu_item=menu,
                defaults={'can_read': True, 'can_write': False}
            )
            
            # 管理员有读写权限
            RoleMenuPermission.objects.get_or_create(
                role=manager_role,
                menu_item=menu,
                defaults={'can_read': True, 'can_write': True}
            )
